#ifndef EmoRecBase_H
#define EmoRecBase_H
// #include "AMP_structure_def.h"
#include "ConfigImport.h"
#include "EmCache.h"
#include "TrainMethod.h"

#define MAX_DATA 10000
typedef struct L1WeightMatrix_para
{
    /* data */
    char *Metric;
    float PCARatio;
    char *NeighborMode;
    int k;
    char *WeightMode;
    int t;
}L1WeightMatrix_para_typeDef;

// 非多线程
class EmoRecBase
{
    public:
        EmoRecBase(ConfigImport* sysconf);
        EmoRecBase(ConfigImport &configPara                   
                            
                            );
        ~EmoRecBase();

        int train();
        void train(arma::cube &data_input);
        int predict(arma::mat &predict_data);
        // void predict(arma::mat &predict_data);
        void predict_test(arma::cube &predict_data);
        int insertLabel(int inputLabel);
        int insertLabel(std::vector<int>& inputLabel);
        void network_created();
        void network_created(arma::cube &inputData);
        void network_created(arma::mat &data, arma::mat &network_output);

        bool generateLabelFromFile(std::string fileName,int labelType);

        void creat_network_cor(arma::mat &data_input, arma::mat &network_output);
        


    public:
        // 配置
        ConfigImport &sys_config;
    private:
        // 缓存
        EmCache network_cache;
        // 缓存就绪标志，false：重新生成脑网络，true：直接可以使用Train_Feature的值
        bool networkCache_prepared;
        // 缓存刷新标志 false:不保存当前脑网络，true:保存当前的脑网络到缓存文件中
        bool refresh_networkCache;

    private:
        // 临时变量
        arma::mat temp_data;
        

    private:
        // 输入的脑电数据（通道数 x 一个trail的点数 x trial数，63x5000x469）
        arma::cube data_org;
        // 训练数据标签
        std::vector<int> train_label;
        std::vector<int> test_label;

        // 相关脑网络，作为训练特征
        arma::mat Train_Feature;
        // LaplaceSupervisedL1算出来的特征向量
        arma::mat l1NormEigvector;

        // 创建一个分类模型
        BTMethod* trainMethod_ptr;
        
    private:
        void cacheConfig_init();
        int LaplaceSupervisedL1(arma::mat &InputData, arma::vec &InputLabel, arma::mat &Eigvector);
        double ObjFun(arma::mat &Sb, arma::mat &Sw, arma::mat &w, arma::mat &IterVector);
        double GreFunc(arma::mat &Sb, arma::mat &Sw, arma::mat &w, arma::mat &IterVector);

};



#endif